#include <iostream>
#include <string>
#include <string.h>

using namespace std;

class myString
{
private:
    char *buf; // 避免内存浪费和动态分配，要有指针进行内存动态分配；
    int len;

public:
    // 定义空字符串
    myString()
    {
        buf = NULL;
        len = 0;
    }
    // 字符串赋值定义
    myString(const char *str)
    {
        len = strlen(str);
        buf = new char[len + 1]; // 动态内存分配
        strcpy(this->buf, str);
    }
    // 对象赋值定义
    myString(const myString &str)
    {
        len = str.len;
        buf = new char[len + 1];
        strcpy(buf, str.buf);
    }
    // 操作字符串
    void operator+=(const char *str)
    {
        int len = strlen(str);
        this->len = len + this->len;
        char *nbuf = new char[this->len + 1]; // 分配拼接后需要的空间大小
        strcpy(nbuf, buf);                    // 复制原来的数据到新的空间
        strcat(nbuf, str);                    // 拼接字符串到新的空间后面
        delete[] buf;                         // 删除原来的字符串空间
        buf = nbuf;                           // 指向拼接后的空间
    }
    // 操作对象
    void operator+=(const myString &str)
    {
        this->len = str.len + this->len;
        char *nbuf = new char[this->len + 1]; // 分配拼接后需要的空间大小
        strcpy(nbuf, buf);                    // 复制原来的数据到新的空间
        strcat(nbuf, str.buf);                // 拼接字符串到新的空间后面
        delete[] buf;                         // 删除原来的字符串空间
        buf = nbuf;                           // 指向拼接后的空间
    }

    myString operator+(const char *str)
    {
        int len = strlen(str);
        char *nbuf = new char[this->len + len + 1]; // 零时保存拼接好的字符串
        strcpy(nbuf, buf);
        strcat(nbuf, str);
        myString temp(nbuf);
        delete[] nbuf;
        return temp;
    }

    myString &operator+(const myString &str)
    {
        char *nbuf = new char[this->len + str.len + 1]; // 零时保存拼接好的字符串
        strcpy(nbuf, buf);
        strcat(nbuf, str.buf);
        myString *temp = new myString(nbuf);
        delete[] nbuf;
        return *temp;
    }

    myString &operator=(const myString &str)
    {
        if (this != &str) // 防止自赋值
        {
            delete[] buf;
            len = str.len;
            buf = new char[len + 1];
            strcpy(buf, str.buf);
        }
        return *this;
    }
    bool operator==(const myString &str)
    {
        return !strcmp(buf, str.buf);
    }
    // 按下标输出
    char operator[](int index)
    {
        if (index > len || index < 0)
        {
            cout << "invalid index" << endl;
            return '\0';
        }
        return buf[index];
    }
    // 析构函数
    ~myString()
    {
        delete[] buf;
    }
    // 返回当前字符串
    char *getString() const
    {
        return buf;
    }
    // 返回字符串长度
    int getLenth() const
    {
        return len;
    }
};

int main()
{
    /*
    myString mst1 = "hello";
    mst1 += "world";
    cout << mst1.getString() << endl;
    */
    myString mst1 = "WangXingXing";
    myString mst2 = "ShiWo";
    cout << "mst1=" << mst1.getString() << endl;
    cout << "mst2=" << mst2.getString() << endl;
    myString mst3;
    mst3 = (mst1 + mst2);
    cout << mst3.getLenth() << endl;
    cout << "mst3=" << mst3.getString() << endl;
    mst1 = mst2 = mst3; // 链式赋值
    cout << "mst1=" << mst1.getString() << endl;
    cout << "mst2=" << mst2.getString() << endl;
    cout << mst3[0] << endl;
    myString mst4 = mst3;
    if (mst4 == mst3)
        cout << "mst4==mst3" << endl;
    else
        cout << "mst4!=mst3" << endl;
    return 0;
}
